elgio
(usa OpenSuSE)
Enviado em 19/05/2008 - 09:36h
Por estas e outras que não gosto do livro C completo e total. :-D
Bom, tu disse que já sabe ponteiros. Vou confiar nisto :-D
Quando eu defino uma estrutura:
struct LIXO {
int a;
int b;
};
E uma variavel para ela:
struct LIXO x;
Se usa o ponto para acessar o membro dela:
x.a = 200;
O C calcula o deslocamento em memória de onde está o membro a da variavel x. x é do tipo struct e tem tamanho de 8 (um sizeof sobre x retorna 8 bytes pois internamente ela tem dois ints de 4)
Mas quando se cria UM PONTEIRO para a estrutura:
struct LIXO *p;
p NÃO É DO TIPO struct LIXO, p é do tipo ponteiro. O tamanho de p é 4 bytes.
Fazer:
p.a = 300;
Vai dar erro, pois p NÃO É ESTRUTURA e não tem membro a (p APONTARÁ para uma estrutura).
Mesmo que eu faça:
p = &x;
(agora p aponta para a minha variável x).
Ainda assim eu não posso fazer um p.a
Como p é ponteiro, SEMPRE que eu desejo acessar o conteúdo, ou seja, o que tem dentro de p, devo usar asterisco, certo? Logo para acessar o membro a devo fazer:
(*p).a = 400;
Isto funciona! Ou seja, a posição de memória para onde p aponta, no seu campo a receberá o valor 400.
Veja este exemplo COMPLETO:
struct LIXO {
int a;
int b;
};
int main ()
{
struct LIXO *p;
struct LIXO x;
p = &x;
(*p).a = 200;
printf("%i\n", x.a);
}
Ok, ok. Mas onde entra a setinha???
Simples. O pessoal do C achou que era muito trabalho usar (*p).a. Muito estranho, mesmo que correto. Logo inventou esta outra alternativa:
p->a = 400;
Isto É O MESMO, EXATAMENTE A MESMA COISA, do que
(*p).a = 400;
[]'s